#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5 + 10;

vector<int> edges[N];
int ret[N];
int n, m;
void dfs(int u, int r)
{
    ret[u] = r;
    for (auto& x : edges[u])
    {
        if (ret[x]) continue;
        dfs(x, r);
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y; cin >> x >> y;
        edges[y].emplace_back(x); // 建反图
    }
    // 现在开始dfs
    for (int i = n; i >= 1; i--)
    {
        if (ret[i]) continue;
        dfs(i, i); // 从哪一个节点出发，然后这个节点及它连接的节点的可以接触到的最大的编号
    }

    // zdl::接下来就直接可以输出结果了，还是很简单的这道题目
    for (int i = 1; i <= n; i++)
    {
        cout << ret[i] << " ";
    }

    return 0;
}